/**
 * @brief CacheThreadPool 缓存专用线程池
 * date:2023/12/18 
 * author:Coolio
 */
#ifndef ZMEDIASERVER_SRC_CACHE_CACHETHREADPOOL_H
#define ZMEDIASERVER_SRC_CACHE_CACHETHREADPOOL_H

#include <memory>
#include "Thread/ThreadPool.h"
#include "Poller/EventPoller.h"
using namespace std;
namespace toolkit {

class CacheThreadPool :
        public std::enable_shared_from_this<CacheThreadPool> ,
        public TaskExecutorGetterImp {
public:
    typedef std::shared_ptr<CacheThreadPool> Ptr;
    ~CacheThreadPool(){};

    /**
     * 获取单例
     * @return
     */
    static CacheThreadPool &Instance();

    /**
     * 设置EventPoller个数，在WorkThreadPool单例创建前有效
     * 在不调用此方法的情况下，默认创建thread::hardware_concurrency()个EventPoller实例
     * @param size  EventPoller个数，如果为0则为thread::hardware_concurrency()
     */
    static void setPoolSize(int size = 0);

    /**
     * 获取第一个实例
     * @return
     */
    EventPoller::Ptr getFirstPoller();

    /**
     * 根据负载情况获取轻负载的实例
     * 如果优先返回当前线程，那么会返回当前线程
     * 返回当前线程的目的是为了提高线程安全性
     * @return
     */
    EventPoller::Ptr getPoller();
private:
    CacheThreadPool() ;
private:
    static int s_pool_size;
};
}
#endif
